#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

struct SegmentTree{
	int n;
	vector<int> l,r,maxn,sum;
	SegmentTree(int n_) : n(n_),l(4*n+1),r(4*n+1),maxn(4*n+1),sum(4*n){}

	void pushup(int k){
		maxn[k]=max(maxn[k<<1],maxn[k<<1|1]);
		sum[k]=sum[k<<1]+sum[k<<1|1];
	}

}tr[M*4];

void build(int k,int l,int r){
	tr[k].l=l,tr[k].r=r;
	if(l==r){
		tr[k].sum=tr[k].maxn=a[l];
		return;
	}int mid=(l+r)>>1;
	build(k<<1,l,mid);
	build(k<<1|1,mid+1,r);
	pushup(k);
}
void update(int k,int l,int r){
	if(tr[k].l==tr[k].r){
		tr[k].maxn=sqrt(tr[k].maxn);
		tr[k].sum=tr[k].maxn;
		return;
	}int mid=(tr[k].l+tr[k].r)>>1;
	if(l<=mid&&tr[k<<1].maxn>1) update(k<<1,l,r);
	if(r>mid&&tr[k<<1|1].maxn>1) update(k<<1|1,l,r);
	pushup(k);
}
int query(int k,int l,int r){
	if(tr[k].l>=l&&tr[k].r<=r) return tr[k].sum;
	int mid=(tr[k].l+tr[k].r)>>1,ret=0;
	if(l<=mid) ret+=query(k<<1,l,r);
	if(r>mid) ret+=query(k<<1|1,l,r);
	return ret;
}
signed main(){
	n=read();
	for(int i=1;i<=n;i++) a[i]=read();
	build(1,1,n),m=read();
	for(int i=1;i<=m;i++){
		int opt=read(),l=read(),r=read();
		if(l>r) swap(l,r);
		if(opt==0) update(1,l,r);
		if(opt==1) printf("%lld\n",query(1,l,r));
	}return 0;
}
